home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-02-26 | 2.5 KB | 73 lines | [TEXT/CCL2] |
- (in-package :ccl)
-
- ;----------------
- ; Redefine-warnings
- ;
- ; This code makes redefinition warnings a little prettier by
- ; collecting them up and printing them all at once for each loaded file.
- ;
- ; straz 15 July 92
-
-
- ; Old version of warning:
- ;Warning: FUNCTION BAR previously defined in: lug nuts:foo.lisp
- ; is now being redefined in: lug nuts:desktop folder:test.lisp
- ;
- ; While executing: RECORD-SOURCE-FILE
- ;Warning: FUNCTION FOO previously defined in: lug nuts:foo.lisp
- ; is now being redefined in: lug nuts:desktop folder:test.lisp
- ;
- ; While executing: RECORD-SOURCE-FILE
- ;Warning: FUNCTION BAZ previously defined in: lug nuts:foo.lisp
- ; is now being redefined in: lug nuts:desktop folder:test.lisp
- ;
- ; While executing: RECORD-SOURCE-FILE
- ;
- ; New version of warning:
- ;
- ;Warning: Multiple redefinitions in lug nuts:desktop folder:test.lisp:
- ; FUNCTION BAZ previously defined in: lug nuts:foo.lisp
- ; FUNCTION BAR previously defined in: lug nuts:foo.lisp
- ; FUNCTION FOO previously defined in: lug nuts:foo.lisp
- ; While executing: MULTI-REDEFINE-WARN
-
- ;-------------------------------------------------
-
-
- (defun simple-redefine-warning? (w)
- (and (typep w 'simple-warning)
- (search "is now being redefined in"
- (slot-value w 'format-string))))
-
- (defmacro redefine-warn (function)
- `(advise ,function
- (let (warnings)
- (multiple-value-prog1
- (handler-bind
- ((simple-warning
- #'(lambda (condition)
- (when (simple-redefine-warning? condition)
- (push condition warnings)
- (muffle-warning)))))
- (:do-it))
- (when warnings (multi-redefine-warn warnings))))
- :when :around :name :collect-warnings))
-
-
- (defun multi-redefine-warn (warnings)
- (flet ((w-args (w) (slot-value w 'format-arguments)))
- (let ((new (fourth (w-args (car warnings)))))
- (cond ((or (= 1 (length warnings))
- (notevery #'(lambda (w) (equalp new (fourth (w-args w)))) warnings))
- (dolist (w warnings) (warn w)))
- (t
- (warn "Multiple redefinitions in ~a:~{~& ~A ~A previously defined in: ~a~}"
- new
- (mapcan #'(lambda (w) (subseq (w-args w) 0 3))
- warnings)))))))
-
- (redefine-warn load)
-
- ;;; Used by Fred's "eval selection" and "eval buffer" commands
- (redefine-warn selection-eval)
-